﻿using IVisual;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Splitter_App
{
    class _cls_Aufbereiten
    {
        public static void ConfigAufbereitenUndAnwenden(_cls_verbindung configModul, int prozentUeberlappung, List<_cls_verbindung> rechnenModule)
        {
            I_config cfg = configModul._cfg.GET_CFG();

            List<List<float[]>> eingabePattern = new List<List<float[]>>();
            List<List<float[]>> ausgabePattern = new List<List<float[]>>();

            int anzahlProModulOhneUeberlappung = cfg._I.GetLength(0) / rechnenModule.Count;

            //Jetzt alle Pattern auf die Moodule aufteilen
            for (int modulidx=0; modulidx<rechnenModule.Count; modulidx++)
            {
                int idxoffset = modulidx * anzahlProModulOhneUeberlappung;
                eingabePattern.Add(new List<float[]>());//Modulebene
                ausgabePattern.Add(new List<float[]>());//Modulebene

                for (int i = 0; i < anzahlProModulOhneUeberlappung; i++)
                {
                    eingabePattern[modulidx].Add(cfg._I[i + idxoffset]);//Patternebene
                    ausgabePattern[modulidx].Add(cfg._O[i + idxoffset]);//Patternebene
                }
            }

            //Überlappung anwenden
            Random r = new Random();
            int absUeberlappung = anzahlProModulOhneUeberlappung * prozentUeberlappung / 100;
            if(absUeberlappung > 0)
            {
                for (int modulidx = 0; modulidx < rechnenModule.Count; modulidx++)
                {
                    for (int i=0; i<absUeberlappung; i++)
                    {
                        int soll_mod = 0;
                        int soll_ind = 0;
                        do
                        {
                            soll_mod = r.Next(0, rechnenModule.Count);
                            soll_ind = r.Next(0, eingabePattern[soll_mod].Count);
                        } while (soll_mod == modulidx);

                        eingabePattern[modulidx].Add(eingabePattern[soll_mod][soll_ind]);
                        ausgabePattern[modulidx].Add(ausgabePattern[soll_mod][soll_ind]);
                    }
                }
            }

            //Configs der Module aktualisieren
            for (int modulidx = 0; modulidx < rechnenModule.Count; modulidx++)
            {
                I_config alt = rechnenModule[modulidx]._cfg.GET_CFG();
                I_config neu = _cls_ObjectCopier.Clone(cfg);
                cfg._I = eingabePattern[modulidx].ToArray();
                cfg._O = ausgabePattern[modulidx].ToArray();
                cfg.Visual_IP = alt.Visual_IP;
                cfg.Visual_Port = alt.Visual_Port;

                if (!cfg.SET_CFG())
                    throw new Exception("Konnte Konfig für ein Modul (" + modulidx + ") nicht speichern!");
            }
        }
    }
}
